package es.udc.acs.consorcio.sesion;

import java.net.SocketTimeoutException;
import java.util.ArrayList;

import es.udc.acs.udp.ClienteUDP;
import es.udc.acs.utils.CodigosFAP;

public class EnRecuperacion extends SesionState {

	@Override
	public String sendMessage(ArrayList<Canal> canales, String question) {
		return CodigosFAP.CE_OTRAS_CAUSAS;
	}

	@Override
	public String receiveMessage(ArrayList<Canal> canales, int canal,
			int respuesta) {
		Canal c = canales.get(canal);
		
		if(c.obtenerNumMensaje() != respuesta){
			return CodigosFAP.CE_MSN_FUERA_SECUENCIA;
		}
		
		if(!c.estaLibre()){
			c.nuevaRespuesta();
		}
		
		if(c.estaLibre()){
			return CodigosFAP.CE_CORRECTO;
		}
		return CodigosFAP.CE_MSN_FUERA_SECUENCIA;
	}

	@Override
	public boolean detenerTrafico(Sesion sesion) {
		return false;
	}

	@Override
	public boolean reanudarTrafico(Sesion sesion) {
		return false;
	}

	@Override
	public boolean cierreSesion(Sesion sesion, ArrayList<Canal> canales,
			String idBanco) {
		return false;
	}

	@Override
	public boolean enRecuperacion(Sesion sesion) {
		return false;
	}

	@Override
	public boolean finRecuperacion(Sesion sesion) {
		return sesion.setState(new RecibirMensajes());
	}

	@Override
	public String obtenerEstado() {
		return "En recuperacion";
	}

	@Override
	public boolean recupera(Sesion sesion, ArrayList<Canal> canales) {
		String respuesta;
		for(Canal c:canales){
			if(c.obtenerNumMensaje() != 0){
				try {
					respuesta = ClienteUDP.sendMessage(
							sesion.getHost(),sesion.getPort(),c.getQuestion(), 60);
					
					recibeRecuperacion(c, respuesta);
					
				} catch (SocketTimeoutException e) {
					// imposible comunicar con el banco
					e.printStackTrace();
				}
			}
		}
		
		return false;
	}
	
	private void recibeRecuperacion(Canal c, String respuesta){

		if(!c.estaLibre()){
			c.nuevaRespuesta();
		}
		c.setResponse(respuesta);
	}
}
